package com.buddy.design.pattern._06template;

import com.buddy.design.pattern._06template.cource.BigDataCourse;
import com.buddy.design.pattern._06template.cource.JavaCource;
import com.buddy.design.pattern._06template.cource.NetWorkCourse;
import org.junit.Test;

public class TemplatePattern {

    /*
     *
     * 模板模式：
     *      模板方法模式（Template Method Pattern），
     *      定义一个算法骨架，并允许子类为一个或者多个步骤提供实现；
     *      使得子类在不改变算法结构的情况下，重新定义算法的某些步骤
     *      属于行为性设计模式
     *
     * 适用场景：
     *      一次性实现一个算法不变的部分，并可将可变的行为留给子类来实现；
     *      各子类中公共的行为被提取出来并集中到一个公共的父类中，从而避免代码重复。
     *
     *  模板模式通常使用抽象类，抽象工厂通常使用接口，也可以使用抽象类
     *  策略关心结果，模板关心流程
     *
     *  规范执行流程和执行逻辑
     *
     *  提高代码的复用性；
     *  提高代码的扩展性；
     *  符合开闭原则；
     *
     *  类数据的增加；
     *  间接地增加了系统实现的复杂度；
     *  继承关系自身缺点，如果父类添加新的抽象方法，所有子类都要改变。
     *
     */

    @Test
    public void networkCourseTest(){
        System.out.println("------JAVA COURSE------");
        NetWorkCourse javaCourse = new JavaCource();
        javaCourse.createCource();

        System.out.println("------BIG DATA COURSE------");
        NetWorkCourse bigDataCourse = new BigDataCourse(true);
        bigDataCourse.createCource();
    }
}
